<?php

/**
 * Класс управляет выдачей отчетов по оценкам
 */
class grade_manager {
	
	function __construct() {
		
	}
	
	function __destruct() {
		
	}
	
	/**
	 * Берет оценки учебных курсов
	 */
	public function get_courses_grades() {
		
	}
	
	/**
	 * Берет идентификаторы спецкурсов, на которые ходит ученик
	 * @param $pupil_id Идентификатор ученика
	 * @return array(
	 * 	[#]
	 * 		['id'] => int
	 * 		['fullname'] => string
	 * )
	 */
	private function get_pupil_special_courses($pupil_id) {
		global $DB;
		$sql = file_get_contents(__DIR__ . '/sql/get_pupil_special_courses.sql');
		
		$stmt = $DB->prepare($sql);
		$stmt->bind_param('i', $pupil_id);
		$stmt->execute();
		
		return $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
	}
	
	function get_scale() {
		global $DB;
		$sql = file_get_contents(__DIR__ . '/sql/get_scale.sql');
		
		$stmt = $DB->prepare($sql);
		$stmt->execute();
		$data = $stmt->get_result()->fetch_array(MYSQLI_ASSOC);
		return explode(", ", $data["scale"]);
	}
	
	private function get_grade($pupil_id, $course_id, $grade_item) {
		global $DB;
		$sql = file_get_contents(__DIR__ . '/sql/get_user_grade.sql');
		
		$stmt = $DB->prepare($sql);
		$stmt->bind_param('isi', $pupil_id, $grade_item, $course_id);
		$stmt->execute();
		
		$data = $stmt->get_result()->fetch_array(MYSQLI_ASSOC);
		
		include_once(__DIR__ . '/class.grade.php');
		return new grade($data['grade'], $this->get_scale());
	}
	
	/**
	 * Берет оценки по спецкурсам по классам
	 * @param string $class Код класса
	 * @return array(
	 * 	[$class]
	 * 		[#]
	 * 			['pupil']
	 * 			['grades']
	 * 				[#]
	 * 					['grade']
	 * 						[0] => int
	 * 						[1] => int
	 * 						[2] => int
	 * 					['course'] => string
	 * )
	 */
	private function get_special_courses_grades_by_class($class) {
		global $CFG;
		include_once($CFG->app_dir . '/class/class.classes.php');
		include_once($CFG->app_dir . '/class/class.school_class.php');
		$classes = new classes($class);
		
		$result = array();
		foreach ($classes->get_classes() as $class) {
			$school_class = new school_class($class, true);
			
			$pupil_iterator = $school_class->get_iterator();
			
			// для каждого ученика в классе
			while ($pupil_iterator->valid()) {
				$pupil = $pupil_iterator->current();
				// найти список спецкурсов, на которые ходит ученик
				$sp_courses = $this->get_pupil_special_courses($pupil->get_id());
				for ($i = 0; $i < count($sp_courses); $i++) {
					$result[$class][$pupil_iterator->key()]['pupil'] = $pupil;
					// для каждого спецкурса найти оценку за 1, 2 полугодие и итоговую
					$result[$class][$pupil_iterator->key()]['grades'][$i]['grade'][0] = $this->get_grade($pupil->get_id(), $sp_courses[$i]['id'], 'I полугодие 2012/13');
					$result[$class][$pupil_iterator->key()]['grades'][$i]['grade'][1] = $this->get_grade($pupil->get_id(), $sp_courses[$i]['id'], 'II полугодие 2012/13');
					$result[$class][$pupil_iterator->key()]['grades'][$i]['grade'][2] = $this->get_grade($pupil->get_id(), $sp_courses[$i]['id'], 'Итоговая оценка за курс');
					$result[$class][$pupil_iterator->key()]['grades'][$i]['course'] = $sp_courses[$i]['fullname'];
				}
				$pupil_iterator->next();
			}
		}
		return $result;
	}
	
	/**
	 * Возвращает список учеников, записанных на данный спецкурс
	 * @param int $course_id Идентификатор курса
	 * @return array(
	 * 	[#] => object pupil
	 * )
	 */
	function get_pupils_in_special_course($course_id) {
		global $CFG, $DB;
		include_once($CFG->app_dir . '/class/class.pupil.php');
		
		$sql = file_get_contents(__DIR__ . '/sql/get_pupils_in_special_course.sql');
		
		$stmt = $DB->prepare($sql);
		$stmt->bind_param('i', $course_id);
		$stmt->execute();
		
		$pupils = array();
		$result = $stmt->get_result();
		while (($data = $result->fetch_array(MYSQLI_ASSOC)) !== NULL) {
			$pupils[] = new pupil($data['id']);
		}
		
		return $pupils;
	}
	
	/**
	 * Берет оценки по спецкурсам по кафедрам
	 * @param string $department_code Код кафедры
	 * @return array(
	 * 	[#]
	 * 		['course'] => string
	 * 		['pupils'] 
	 * 			[#]
	 * 				['pupil'] => object pupil
	 * 				['grades']
	 * 					[0] => int
	 * 					[1] => int
	 * 					[2] => int
	 * )
	 */
	private function get_special_courses_grades_by_department($department_code) {
		global $CFG;
		include_once($CFG->app_dir . '/department/class.departments.php');
		include_once($CFG->app_dir . '/special_courses_grade/class.special_courses.php');
		
		// находим название кафедры
		$departments = new departments($department_code);
		$department_name = $departments->get_department_name();
		
		// находим список спецкурсов для кафедры
		$special_courses = new special_courses();
		$special_courses->set_department_name($department_name);
		$sp_courses = $special_courses->get_courses();
		
		$result = array();
		// для каждого спецкурса:
		for ($i = 0; $i < count($sp_courses); $i++) {
			// находим список учеников, которые на него записаны
			$pupils = $this->get_pupils_in_special_course($sp_courses[$i]['id']);
			$result[$i]['course'] = $sp_courses[$i]['fullname'];
			// для каждого ученика:
			for ($j = 0; $j < count($pupils); $j++) {
				$result[$i]['pupils'][$j]['pupil'] = $pupils[$j];
				// находим оценку за 1, 2 полугодие и итоговую
				$result[$i]['pupils'][$j]['grades'][0] = $this->get_grade($pupils[$j]->get_id(), $sp_courses[$i]['id'], 'I полугодие 2012/13');
				$result[$i]['pupils'][$j]['grades'][1] = $this->get_grade($pupils[$j]->get_id(), $sp_courses[$i]['id'], 'II полугодие 2012/13');
				$result[$i]['pupils'][$j]['grades'][2] = $this->get_grade($pupils[$j]->get_id(), $sp_courses[$i]['id'], 'Итоговая оценка за курс');
			}
		}
		return $result;
	}
	
	/**
	 * Берет оценки по спецкурсам
	 * @param string $report_type Тип отчета (по классу или по кафедре)
	 * @param string $param Код кафедры или класса
	 * @return array
	 */
	public function get_special_courses_grades($report_type, $param) {
		return $data = $this->{'get_special_courses_grades_' . $report_type}($param);
	}
}

?>
